/*
搜索过程：不断从队列取出一个节点，进行上下左右的扩展，判断边界，符合就放入队列，不符合就跳过*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 1005
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct
{
	int first;
	int second;
} PII;
char Map[M][M];
int dx[] = {0, 1, -1, 0};
int dy[] = {1, 0, 0, -1};
int n, m, k;
PII q[M * M];
int front = 0, rear = 0;
int len;
// 这个函数用于判断给定的坐标(x, y)是否在指定范围内且对应的地图位置不是'g'。
int pd(int x, int y)
{
	if (x < 1 || x > n || y < 1 || y > m || Map[x][y] == 'g')
	{
		return 0;
	}
	return 1;
}
void BFS()
{
	while (front < rear && k > 0)
	{							   // 队列不为空且k>0
		PII tempPair = q[front++]; // 从队列中取出节点tempPair并获取其坐标x和y
		int x = tempPair.first;
		int y = tempPair.second;
		for (int i = 0; i < 4; i++)
		{ // 对该节点的四个相邻节点进行遍历，计算它们的坐标
			int nowx = x + dx[i];
			int nowy = y + dy[i];
			if (pd(nowx, nowy))
			{ // 满足条件
				PII tempPair2;
				tempPair2.first = nowx;
				tempPair2.second = nowy;
				q[rear++] = tempPair2;
				Map[nowx][nowy] = 'g'; // 将节点标记为g
			}
		}
		len--;
		if (len == 0)
		{						// 表示当前层的节点已经全部遍历完
			k--;				// 此时将k减一
			len = rear - front; // 并更新len为下一层节点的数量
		}
	}
}
int main(int argc, char *argv[])
{
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		scanf("%s", Map[i] + 1);
		for (int j = 1; j <= m; j++)
		{
			if (Map[i][j] == 'g') // 如果有g，就把该位置坐标存储再tempPair的结构体中，并将tempPair存储在队列q中
			{
				PII tempPair;
				tempPair.first = i;
				tempPair.second = j;
				q[rear++] = tempPair;
			}
		}
	}
	len = rear; // 队列长度len即队列中元素的个数
	scanf("%d", &k);
	BFS(); // 进行广度优先搜索
	for (int i = 1; i <= n; i++)
	{
		printf("%s\n", Map[i] + 1);
	}

	return 0;
}
